home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / TreeView / TreeView.m < prev   
Text File  |  1995-06-12  |  2KB  |  80 lines

  1.  
  2. #import "TreeView.h"
  3. #import "TreeButton.h"
  4. #import "NamedTree.h"
  5. #import "Line.h"
  6.  
  7. // constants to determine how the buttons are laid out
  8. #define BUTTONWIDTH        128.0
  9. #define BUTTONHEIGHT    24.0
  10. #define VERTSPACING        8.0
  11. #define HORIZSPACING    40.0
  12.  
  13. @implementation TreeView
  14.  
  15. - buildTreeFromNode:aNode bottom:(double)ybot
  16.         top:(double)ytop atX:(double)xpos parent:(NXPoint *)pos
  17. {    // add a button representing the node to the View
  18.     // This method is recursive.
  19.     NXRect butFrame = {{(xpos + HORIZSPACING),
  20.             (ybot + (ytop - ybot) / 2 - BUTTONHEIGHT / 2)},
  21.             {BUTTONWIDTH, BUTTONHEIGHT}};
  22.     id newButton = [[[TreeButton alloc] initFrame:&butFrame]
  23.             setTreeNode:aNode];
  24.     id kid, kids = [aNode branches];
  25.     int numBranches = [kids count];
  26.     int i, treeWidth; double diff, accum = ybot;
  27.     NXPoint myCenter = {(NX_X(&butFrame) + BUTTONWIDTH / 2),
  28.             (NX_Y(&butFrame) + BUTTONHEIGHT / 2)};
  29.     id newLine;
  30.     
  31.     [newButton setTitle:[aNode label]];
  32.     [self addSubview:newButton];
  33.     // line to parent:
  34.     if (pos) {    // NULL if root, so no line
  35.         newLine = [[Line alloc] init];
  36.         [newLine setStart:pos end:&myCenter];
  37.         [lineList addObject:newLine];
  38.     }
  39.     // now add any children and the lines to them.
  40.     for (i=0; i<numBranches; i++) { // loop isn't entered if no kids.
  41.         kid = [kids objectAt:i];
  42.         treeWidth = [kid width];
  43.         diff = (treeWidth * (BUTTONHEIGHT + VERTSPACING));
  44.         [self buildTreeFromNode:kid bottom:accum
  45.                 top:(accum + diff + VERTSPACING)
  46.                 atX:(xpos + BUTTONWIDTH + HORIZSPACING)
  47.                 parent:&myCenter];
  48.         accum += diff;
  49.     }
  50.     return self;
  51. }
  52.  
  53. - attachTree:aTree
  54. {
  55.     int treeWidth = [aTree width];
  56.     int treeDepth = [aTree depth];
  57.     double height = (treeWidth * (BUTTONHEIGHT + VERTSPACING) + VERTSPACING);
  58.     double width  = (treeDepth * (BUTTONWIDTH + HORIZSPACING) + HORIZSPACING);
  59.     
  60.     if (lineList) [[lineList freeObjects] free];
  61.     lineList = [[List alloc] init];
  62.     // resize the View to accomodate the Buttons
  63.     [self sizeTo:width :height];
  64.     [self buildTreeFromNode:aTree bottom:0.0 top:height atX:0.0 parent:NULL];
  65.  
  66.     return self;
  67. }
  68.  
  69. - drawSelf:(NXRect *)rects :(int)rectCount      // standard rendering method
  70. {
  71.     PSsetgray(NX_DKGRAY);
  72.     NXRectFill(&bounds);
  73.     PSsetgray(NX_BLACK);
  74.     PSsetlinewidth(2.0);
  75.     [lineList makeObjectsPerform:@selector(render)];
  76.     return self;
  77. }
  78.  
  79. @end
  80.